// 开发环境的插件electron
import type { Plugin } from 'vite'
import type { AddressInfo } from 'net'
import { spawn } from 'child_process'
import fs from 'node:fs'

// 同步构建 electron 文件
// 将 electron入口文件 .ts 同步打包成 .js
const buildBackgroud = () => {
    require('esbuild').buildSync({
        entryPoints: ['electron/index.ts'],
        bundle: true,
        outfile: 'dist/electron/index.js',
        platform: 'node',
        target: 'node12',
        external: ['electron']
    })
}

// vite 插件要求必须导出一个对象，对象必须有name属性
export const ElectronDevPlugin = (): Plugin => {
    return {
        name: 'electron-dev',
        // 使用vite独有的钩子：目的是在配置服务时可以启动子进程
        configureServer(server) {
            // 同步构建 electron 文件：将 electron入口文件 .ts 同步打包成 .js
            buildBackgroud()
            // 监听vite服务： 获取IP地址，启动electron子进程，将IP传递给子进程
            server.httpServer?.once('listening', () => {
                // 读取vite服务信息
                const addressInfo = server.httpServer?.address() as AddressInfo
                // 拼接ip地址：给electron启动服务的时候要用
                const IP = `http://localhost:${addressInfo.port}`
                console.log("IP -----> ", IP)
                /**
                 *  启动子进程
                 *  spawn返回进程的信息(进程传参发送给 electron IP地址)
                 *  第一个参数：electron的入口文件， require('electron') 返回的是一个路径
                 *  第二个参数：指向 electron的主进程文件 ---> dist/electron/index.js
                 * （ 注意：electron 不认识ts文件，需要先编译成js文件 ）
                 */
                let ElectronProcess = spawn(require('electron'), ['dist/electron/index.js', IP])
                // 监听 electron 文件，实现热重启
                fs.watchFile('electron/index.ts', () => {
                    // 杀死原有子进程
                    ElectronProcess.kill()
                    // 重新构建'electron'文件
                    buildBackgroud()
                    // 重启子进程
                    ElectronProcess = spawn(require('electron'), ['dist/electron/index.js', IP])
                })
                // 打印日志
                ElectronProcess.stderr.on('data', (data) => {
                    console.log('日志', data.toString())
                })
            })
        }
    }
}